package pers.agony.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pers.agony.dao.OrderSettingDao;
import pers.agony.exception.MyException;
import pers.agony.pojo.OrderSetting;
import pers.agony.service.OrderSettingService;
import pers.agony.utils.POIUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author : Agony
 * @date : Created in 12:01 下午 2021/11/4
 * @Description:
 * @Modified By:
 * @version: : 1.0
 */
@Service
public class OrderSettingServiceImpl implements OrderSettingService {

    @Autowired
    private OrderSettingDao orderSettingDao;

    @Transactional//* 事务控制
    @Override
    public void doImport(ArrayList<OrderSetting> orderList) {
        //* 遍历List<Ordersetting>集合
        for (OrderSetting order : orderList) {
            //* 通过预约日期查询是否存在预约设置信息
            OrderSetting orderInDB = orderSettingDao.findByOrderDate(order.getOrderDate());
            if (orderInDB != null) {
                //* 存在：
                //  * 要判断已预约数是否大于最大预约数（即将更新的），如果 大于则报错。
                int Reservations = orderInDB.getReservations();
                int maxRes = order.getNumber();
                if (Reservations > maxRes) {
                    throw new MyException("最大预约数不可小于已预约数！");
                }
                //  * 小于，则更新最大预约数
                orderSettingDao.updateMaxRes(order);
            } else {
                //* 不存在：
                //  * 添加记录
                orderSettingDao.add(order);
            }
        }

    }

    //根据日期查询预约设置数据
    @Override
    public List<Map> getOrderSettingByMonth(String date) {//2019-03
        // 1.组织查询Map，dateBegin表示月份开始时间，dateEnd月份结束时间
        String dateBegin = date + "-01";//2019-03-1
        String dateEnd = date + "-30";//2019-03-31
        // MYSQL 8.0.26对日期约束很奇怪 会对2月的日期自动调整，但是其他小月不能有31天，否则会报错，提示错误的Date数据
        //如果使用between，对月份没有任何要求，但是会有部分数据无法搜索到，但是如果使用<=和>=，就会对月份进行严格要求（2月例外）
        
        //经过测试发现，当使用between string and string（string是日期）的时候，如果遇到错误日期，比如11-31，不会报错，
        //但是查询不到任何信息。但是如果使用&gt;=和&lt;=的话，则对于错误日期直接报错


        Map map = new HashMap();
        map.put("dateBegin",dateBegin);
        map.put("dateEnd",dateEnd);
        // 2.查询当前月份的预约设置
        List<OrderSetting> list = orderSettingDao.getOrderSettingByMonth(map);
        List<Map> data = new ArrayList<>();
        // 3.将List<OrderSetting>，组织成List<Map>
        for (OrderSetting orderSetting : list) {
            Map orderSettingMap = new HashMap();
            orderSettingMap.put("date",orderSetting.getOrderDate().getDate());//获得日期（几号）
            orderSettingMap.put("number",orderSetting.getNumber());//可预约人数
            orderSettingMap.put("reservations",orderSetting.getReservations());//已预约人数
            data.add(orderSettingMap);
        }
        return data;
    }

    //根据日期修改可预约人数
    public void editNumberByDate(OrderSetting orderSetting) {
        OrderSetting osInDB = orderSettingDao.findByOrderDate(orderSetting.getOrderDate());
        //- 存在：
        if(null != osInDB) {
            //  - 要判断已预约数是否大于最大预约数（即将更新的），
            int reservations = osInDB.getReservations();// 已预约人数
            int number = orderSetting.getNumber();// 要更新的最大预约值
            if(reservations > number){
                //如果 大于则报错。
                throw new MyException("已预约人数不能大于最大预约数");
            }
            //  - 小于或等于，则更新最大预约数
            orderSettingDao.updateMaxRes(orderSetting);
        }else {
            //- 不存在：
            //  - 添加记录
            orderSettingDao.add(orderSetting);
        }
    }
}
